package jogador;
import arvores.No;


public class Contador {
	private No no_inicial;
	private int num_nos = 0;

	public Contador(Jogador[] jogadores){	
		assert(jogadores != null);
		for(int i = 0; i != jogadores.length; i++){
			assert (jogadores[i] != null);
			adicionaJogador(jogadores[i]);
		}
	}

	private void adicionaJogador(Jogador jogador){
		assert (jogador != null);
		No novo_no = new No(jogador);
		if (no_inicial == null) {
			novo_no.setProximo(novo_no);
			no_inicial = novo_no;
		} else {
			No auxiliar = no_inicial;
			while (auxiliar.getProximo() != no_inicial){
				auxiliar = auxiliar.getProximo();
			}
			auxiliar.setProximo(novo_no);
			novo_no.setProximo(no_inicial);

		}
		this.num_nos++;
	}

	public Jogador[] getJogadores(){
		assert (no_inicial != null && no_inicial.getJogador() != null);
		Jogador[] jogadores = new Jogador[this.num_nos];
		int i = 0;
		jogadores[i] = no_inicial.getJogador();
		No auxiliar = no_inicial;
		i++;
		while(auxiliar.getProximo() != no_inicial){
			auxiliar = auxiliar.getProximo();
			jogadores[i] = auxiliar.getJogador();
			i++;
		}
		return jogadores;
	}

	public void tiraJogador(Jogador jogador_a_tirar){
		assert (jogador_a_tirar != null);
		No auxiliar = no_inicial;
		No auxiliar2 = auxiliar.getProximo();
		int i=0;
		while(!auxiliar2.getJogador().equals(jogador_a_tirar) && i<=this.num_nos){
			auxiliar = auxiliar2;
			auxiliar2 = auxiliar2.getProximo();
			i++;
		}
		if(this.no_inicial == auxiliar2){
			this.no_inicial = auxiliar2.getProximo();
		}
		auxiliar.setProximo(auxiliar2.getProximo());
		this.num_nos--;
	}


	public void entraJogadorJogo(Jogador jogador){
		assert (jogador != null);
		No auxiliar = no_inicial;
		while( auxiliar.getJogador() != jogador){
			auxiliar = auxiliar.getProximo();
		}
		no_inicial = auxiliar;
	}
	//Define o primeiro jogador a jogar, e come�a a rota��o de jogadores a partir da�


	public Jogador proximoJogador(){
		no_inicial = no_inicial.getProximo();
		return no_inicial.getJogador();
	}
	//Devolve o pr�ximo Jogador a lan�ar uma carta e poe-no como jogador actual


	public Jogador jogadorActual(){
		assert(no_inicial != null && no_inicial.getJogador() != null);
		return no_inicial.getJogador();
	}
	//Devolve o jogador actual

	public int length(){
		return this.num_nos;
	}

}
